package com.katze.boot.plugins.shiro.annotations;

import org.apache.shiro.authz.annotation.Logical;
import org.springframework.core.annotation.AliasFor;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import java.lang.annotation.*;

@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@RequestMapping
public @interface RestRequestMapping {
    /**
     * 指定请求的实际地址，指定的地址可以是URI Template 模式
     * a.普通的具体值
     *  RequestMapping(value = "/list")
     *  RequestMapping(value = {"","/page","page*"})
     * b.含有某变量的一类值(URI Template Patterns with Path Variables)
     *  RequestMapping(value = "/list/{communityId}")
     * c.含正则表达式的一类值( URI Template Patterns with Regular Expressions)
     *  RequestMapping(value = "/list/{communityId:[a-z-]+}-{version:\d\.\d\.\d}.{extension:\.[a-z]}")
     */
    @AliasFor(attribute = "value", annotation = RequestMapping.class)
    String[] value() default {};

    /**
     * 指定请求的method类型， GET、POST、PUT、DELETE等
     * 例如：RequestMapping(value = "/list" , method = RequestMethod.POST)
     */
    @AliasFor(attribute = "method", annotation = RequestMapping.class)
    RequestMethod[] method() default { RequestMethod.GET };

    /**
     * 指定request中必须包含某些参数值时，才让该方法处理
     * 例如：设定必须包含username 和age两个参数，且age参数不为10 (可以有多个参数)
     * RequestMapping(value = "/list" , method = RequestMethod.POST,params = { "username","age!=10" })
     */
    @AliasFor(attribute = "params", annotation = RequestMapping.class)
    String[] params() default {};

    /**
     * 指定request中必须包含某些指定的header值，才能让该方法处理请求
     * 例如:仅处理request的header中包含了指定“Refer”请求头和对应值为“http://www.ifeng.com/”的请求；
     * RequestMapping(value = "/list" , method = RequestMethod.POST,headers="Referer=http://www.ifeng.com/")
     */
    @AliasFor(attribute = "headers", annotation = RequestMapping.class)
    String[] headers() default {};

    /**
     *  指定处理请求的 提交内容类型 （Content-Type）
     *  例如:方法仅处理request Content-Type为“application/json”类型的请求
     *  RequestMapping(value = "/list" , method = RequestMethod.POST,consumes="application/json")
     */
    @AliasFor(attribute = "consumes", annotation = RequestMapping.class)
    String[] consumes() default {};

    /**
     * 指定 返回的内容类型 ，仅当request请求头中的(Accept)类型中包含该指定类型才返回
     * a.返回值是json数据
     *  RequestMapping(value = "/list" , method = RequestMethod.POST,produces="application/json")
     * b.responseBody就是返回值是json数据，使用@responseBody，就可以省略produces属性
     *  RequestMapping(value = "/list" , method = RequestMethod.POST)
     *  ResponseBody
     * c.返回值是json数据，字符编码为utf-8
     *  RequestMapping(value = "/list" , method = RequestMethod.POST,produces="application/json;charset=utf-8")
     */
    @AliasFor(attribute = "produces", annotation = RequestMapping.class)
    String[] produces() default {}; //

    /**
     * 请求权限（Shiro使用）
     */
    String[] permits() default "";

    /**
     * 多权限逻辑符（Shiro使用）
     */
    Logical logical() default Logical.AND;


    /**
     * 接口描述
     */
    String desc() default "";

    /**
     * aop拦截
     */
    boolean skip() default false;
}
